#include<bits/stdc++.h>
using namespace std;
int n,m,a,b;
vector<int> E[150005];
vector<pair<int,int> > G[300005];
void addE(int u,int v){
	E[u].push_back(v);
	return;
}
void addG(int u,int v,int c){
	G[u].push_back(make_pair(v,c));
	return;
}
int pocnt;
long long dis[300005];
struct po{
	int id;
	long long dis;
	inline bool operator <(const po &a)const{
		return dis>a.dis;
	}
};
priority_queue<po> q;
bool vis[300005];
void dij(){
	for(int i=1;i<=pocnt;i++)dis[i]=1e18,vis[i]=0;
	dis[1]=0;
	q.push((po){1,0});
	while(!q.empty()){
		int u=q.top().id;
		q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(auto p:G[u]){
			if(dis[p.first]>dis[u]+p.second){
				dis[p.first]=dis[u]+p.second;
				q.push({p.first,dis[p.first]});
			}
		}
	}
	return;
}
int x,y;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	freopen("edge.in","r",stdin);
	freopen("edge.out","w",stdout);
	cin>>n>>m>>a>>b;
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		addE(x,y);
		addE(y,x);
		addG(x,y,a);
		addG(y,x,a);
	}
	pocnt=n;
	for(int i=1;i<=n;i++){
		pocnt++;
		for(auto p:E[i]){
			addG(p,pocnt,0);
			addG(pocnt,p,b);
		}
	}
	dij();
	for(int i=2;i<=n;i++)cout<<dis[i]<<"\n";
	return 0;
}